﻿// See https://aka.ms/new-console-template for more information

//信号量类似于一个通道：它具有一定的容量（capacity）房间，并且有保安把守。一旦满员，就不允许其他人进入，这些人将在外面排队。当有一个人离开时，排在最前头的人便可以进入。
//容量为1的的信号量就是一把互斥锁，类似mutex，不同的是信号量没有【所有者】，它是线程无关（thread-agnostic）的。任何线程都可以在调用Semaphore上的Release方法，而对于mutex，只有获得锁的线程才可以释放该锁。
SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(3, 3);//创建一个初始计数为3，最大计数为3的信号量

Parallel.For(0, 10, dosomething);


Console.WriteLine("Hello, World!");


void dosomething(int para)
{
    Console.WriteLine($"线程id：{Thread.GetCurrentProcessorId()}，开始执行任务");
    _semaphoreSlim.Wait();//获取一个信号量，如果没有可用的信号量，则阻塞线程直到有可用的信号量
    Console.WriteLine($"线程id：{Thread.GetCurrentProcessorId()}，获取到信号量，开始执行任务 时间：{DateTime.Now}");
    Thread.Sleep(1000); //模拟业务执行时间
    Console.WriteLine($"线程id：{Thread.GetCurrentProcessorId()}，任务执行完成，释放信号量");
    _semaphoreSlim.Release();//释放一个信号量，增加可用的信号量数量
}
